Chi tiết Assertion (phát triển phần mềm)

Đoạn mã sau chứa hai assertion, x > 0x > 1, và chúng quả thực là true tại các điểm được chỉ định trong quá trình thực thi:

x = 1;assert x > 0;x++;assert x > 1;

Lập trình viên có thể sử dụng assertion để giúp trong việc đặc tả chương trình và để suy lý về tính đúng sai của chương trình. Ví dụ, điều kiện tiên quyết – tức assertion đặt ở phần đầu của đoạn code – xác định tập hợp trạng thái mà lập trình viên mong rằng dựa vào đó mã sẽ thực thi, và điều kiện hậu quyết – đặt ở phần cuối – mô tả trạng thái mong muốn khi kết thúc thực thi. Ví dụ:

x > 0 { x++ } x > 1

Ví dụ trên sử dụng loại ký pháp để kèm assertion được C. A. R. Hoare sử dụng trong bài viết năm 1969 của mình.[1] Loại ký pháp này không thể sử dụng được trong các ngôn ngữ lập trình dòng chính hiện có. Tuy nhiên, lập trình viên có thể kèm assertion unchecked[lower-alpha 3] trong run-time bằng cách dùng tính năng chú thích của ngôn ngữ lập trình mà mình dùng. Ví dụ, trong C:

x = 5;x = x + 1;// {x > 1}

Dấu ngoặc nhọn kèm trong comment giúp phân biệt cách sử dụng comment thế này với cách sử dụng thế khác.

Các thư viện cũng có thể cung cấp tính năng assertion. Ví dụ, trong C sử dụng glibc với hỗ trợ C99:

#include <assert.h>int f(void){  int x = 5;  x = x + 1;  assert(x > 1);}

Vài ngôn ngữ lập trình hiện đại có bao gồm checked assertion – tức câu lệnh được kiểm tra trong run-time hoặc đôi khi được kiểm tra tĩnh. Nếu assertion tính giá trị ra false trong run-time thì sẽ dẫn đến assertion bất thành, từ đó thường khiến việc thực thi được bỏ dở. Như vậy sẽ hướng được sự chú ý đến vị trí phát hiện ra sự bất nhất logic, và có lẽ càng tốt khi hướng được luôn đến cái hành trạng của chương trình mà đáng ra phải chạy được nếu không bị lỗi.

Sử dụng assertion giúp lập trình viên thiết kế, phát triển và suy lý về chương trình.

Tài liệu tham khảo

WikiPedia: Assertion (phát triển phần mềm) http://www.jaggersoft.com/pubs/CVu11_3.html http://docs.oracle.com/javase/8/docs/technotes/gui... http://docs.oracle.com/javase/8/docs/technotes/gui... http://sunnyday.mit.edu/16.355/Hoare-CACM-69.pdf http://queue.acm.org/detail.cfm?id=2220317 http://dlang.org/version.html#StaticAssert http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arn... http://discovery.ucl.ac.uk/4991/1/4991.pdf https://library.ias.edu/files/pdfs/ecp/planningcod... https://web.archive.org/web/2021*/http://lambda-th...